Перейти к основному содержимому

5.03. JavaServer Faces

Разработчику Архитектору

JavaServer Faces

JavaServer Faces (JSF) – серверный фреймворк с открытым исходным кодом, предназначенный для построения пользовательских интерфейсов для веб-приложений на основе Java. Он следует паттерну MVC (Model-View-Controller) и предоставляет:

  • компонентную модель UI;
  • поддержку событий;
  • управление состоянием;
  • конвертацию и валидацию данных.

JSF работает по принципу жизненного цикла запроса, который состоит из следующих фаз:

  • Restore View – восстановление представления (UI);
  • Apply Request Values – обработка значений из запроса;
  • Process Validations – проверка корректности введённых данных;
  • Update Model Values – обновление модели (бина);
  • Invoke Application – вызов бизнес-логики;
  • Render Response – отправка ответа клиенту (рендеринг страницы).

Все эти фазы управляются FacesServlet, который является контроллером MVC.

Сервлеты (Servlets) — это Java-классы, которые обрабатывают HTTP-запросы и формируют HTTP-ответы на стороне сервера. Они работают внутри сервлет-контейнера (например, Tomcat), расширяя функциональность веб-сервера. Обычно используются для создания динамического контента, например, генерации HTML на лету или обработки форм. Сервлет реализует интерфейс javax.servlet.Servlet (чаще через HttpServlet) и переопределяет методы вроде doGet(), doPost(). Их жизненный цикл включает три ключевых этапа: инициализация (init() ), обработка запроса (service()/doX() ), уничтожение (destroy() ).

Сервлет обрабатывает HTTP-запросы, выполняет логику и генерирует динамический контент (например, HTML, JSON). Пример:

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// Генерация ответа
}
}

JSF использует FacesServlet как точку входа вместо обычного сервлета.

JSP (JavaServer Pages) – технология создания динамических веб-страниц на основе HTML с внедрением Java-кода. Но начиная с JSF 2.0 рекомендуется использовать Facelets, а не JSP.

Facelets – современный механизм шаблонизации для JSF. Он поддерживает XHTML-файлы, компоненты JSF (<h:inputText>, <h:commandButton> и т.д.), шаблоны (<ui:insert>, <ui:define>), перезапись частей страницы без полной перезагрузки. Рендеринг – процесс преобразования JSF-компонентов в HTML, который отправляется браузеру клиента. JSF использует рендереры, связанные с каждым компонентом, чтобы определить, как тот должен отображаться. Пример:

<h:inputText value="#{user.name}" />
<!-- Рендерится как <input type="text" name="..." /> -->

Facelets использует набор тегов для построения UI. Основные пространства имён:

Рассмотрим типы тегов.

Теги для текстовых полей:

  • <h:inputText> - однострочное текстовое поле;
  • <h:inputTextarea> - многострочное поле (textarea);
  • <h:inputSecret> - поле для ввода пароля (скрытый ввод).

В теге <h:inputText> могут быть и атрибуты, к примеру, required="true" указывает, что поле обязательно к заполнению, а requiredMessage="..." это сообщение об ошибке, которое выводится, если поле не заполнено.

Пример:

<h:inputText value="#{user.login}" />
<h:inputSecret value="#{user.password}" />
<h:inputTextarea value="#{user.description}" />
<h:inputText value="#{user.email}" required="true"
requiredMessage="Пожалуйста, введите email" />

Теги для конвертации используются для преобразования типов:

  • <f:convertDateTime> - преобразование даты и времени;
  • <f:convertNumber> - преобразование чисел (формат валюты, процентов и т.д.);
  • <f:converter> - кастомный конвертер.

Пример:

<h:outputText value="#{now}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm" />
</h:outputText>

Тег <h:form> используется для создания HTML-формы, которая может взаимодействовать с JSF. Обеспечивает передачу данных на сервер, поддерживает AJAX-запросы через <f:ajax>, и обязателен для всех JSF-вводных компонентов.

Пример:

<h:form>
<h:inputText value="#{user.name}" />
<h:commandButton value="Отправить" action="#{user.save}" />
</h:form>

Событие – это действие, происходящее в приложении, например, нажатие кнопки, выбор элемента, изменение значения поля. В JSF есть несколько типов событий:

  • ActionEvent – при нажатии на кнопку или ссылку;
  • ValueChangeEvent – при изменении значения поля;
  • PhaseEvent – на каждой фазе жизненного цикла запроса.

Класс-слушатель – это объект, который ожидает наступления события и реагирует на него. Можно реализовать интерфейсы: ActionListener, ValueChangeListener, PhaseListener.

Пример:

public class MyActionListener implements ActionListener {
public void processAction(ActionEvent event) {
System.out.println("Кнопка нажата!");
}
}

Так, JSF нужен для чистого разделения логики и представления, переиспользования UI-элементов, динамического обновления части страницы (благодаря поддержке AJAX), автоматической проверки и преобразования данных, упрощения создания сложных UI, и поддерживается многими IDE.